#include <iostream>

using namespace std;

class a
{
public:
    operator int() const // 常量函数
    {
        return 100;
    }
    void printName()
    {
        cout << "A" << endl;
    }
    virtual ~a()
    {
        cout << "~a" << endl;
    }
};

class b : public a
{
public:
    void printName()
    {
        cout << "B" << endl;
    }
    ~b()
    {
        cout << "~b" << endl;
    }
};

class c
{
public:
    int x;
};

int main(int argc, char const *argv[])
{
    // static_cast主要用于向上转化和基本数据类型转化
    /*
    b *p1 = new b;
    a *p2 = static_cast<a *>(p1);
    p2->printName();
    delete p2;
    return 0;
    */
    // dynamic_cast主要用于多态类的向下转化，系统会检测指针指向的对象类型
    /*
    a *p3 = new b;
    b *p4 = dynamic_cast<b *>(p3);
    if (p4 == NULL)
    {
        cout << "转换失败" << endl;
    }
    else
    {
        p4->printName();
    }
    return 0;
    */
    // const_cast用于去掉指针的const标记，但不会修改原常量的值，不推荐使用
    /*
    const int n=100;
    cout << n<<endl;
    int *p=const_cast<int *>(&n);
    *p=999;
    cout << n <<endl;//还是100
    */
    // reinterpret_cast用于低级别的指针类型转化，不建议使用，它不会监测类型的兼容性
    /*
    int *a = new int(97);
    cout << *a << endl;
    char *p=reinterpret_cast<char*>(a);
    cout << *p<<endl;
    */
    // 自定义转换函数
    /*a a1;
    int num = static_cast<int>(a1);
    cout << num << endl;
    */
    // 虚函数，指针实际指向谁就调用谁的虚函数，反之调用指针类对象的虚函数
    a *p=new b;
    delete p;
}
